package ecom.ejb;

import ecom.ejb.CartLocal.StatutCart;
import ecom.entity.AccountRemote;
import ecom.entity.CommandeRemote;
import ecom.entity.LigneRemote;
import ecom.entity.ProductRemote;
import exceptions.AccountException;
import exceptions.CartException;
import exceptions.IdentifiantInvalide;
import exceptions.InstanceInvalide;
import java.util.Set;
import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateful;
import javax.persistence.NoResultException;

@Stateful
@Remote(CustomerRemote.class)
public class CustomerBean extends CommonBean implements CustomerRemote {

    @EJB
    CartLocal cart;

    /** 
     * @return the cart 
     **/
    @Override
    public CartLocal getCart() {
        return this.cart;
    }


    @Override
    public AccountRemote connectAccount(String identifiant, String motDePasse) {
	AccountRemote retour = null;

	/*
	 * Récupération de l'objet
	 */
	try {
	    retour = (AccountRemote) em.createNamedQuery("Account.connect")
		    .setParameter("paramId", identifiant)
		    .getSingleResult();
	} catch (NoResultException e) {
	    retour = null;
	}

	/*
	 * Vérification du mot de passe
	 */
	if (retour != null && !retour.getMotDePasse().equals(motDePasse)) {
	    retour = null;
	}

	return retour;
    }


    @Override
    public void addProduitCart(ProductRemote produit, int quantite)
	    throws CartException {
	this.cart.addProduit(produit, quantite);
    }

    @Override
    public void removeProduitCart(ProductRemote produit, int quantite)
	    throws CartException {
	this.cart.removeProduit(produit, quantite);
    }

    @Override
    public CommandeRemote buyCart(AccountRemote compte) throws CartException {
	return this.cart.buy(compte);
    }

    @Override
    public void confirmCommande(CommandeRemote commande)
	    throws IdentifiantInvalide, AccountException, InstanceInvalide {
	/*
	 * Récupération de l'instance dans la couche de persistance
	 */
	AccountRemote compte = this.getAccount(commande.getCompte().getIban());

	/*
	 * Vérification si solde toujours valide
	 */
	if (compte.getSolde() >= commande.getMontant()) {
	    commande.getCompte().withdraw(commande.getMontant());
	    this.updateAccount(commande.getCompte());

	    /*
	     * Sauvegarde de la commande et des lignes
	     */
	    em.persist(commande);
	    for (LigneRemote ligne : commande.getLignes()) {
		ligne.setCommande(commande);
		em.persist(ligne);
	    }

	    this.cart.setStatut(StatutCart.BOUGHT);
	}
    }

    @Override
    public void cancelCart() {
	this.cart.cancel();
    }

    @Override
    public double getMontantCart() {
	return this.cart.getMontant();
    }
    
    @Override
    public Set<LigneRemote> getProduitsCart() {
	return this.cart.getProduits();
    }

    @Override
    public StatutCart getStatutCart() {
	return this.cart.getStatut();
    }

}
